/**
 * 错误处理工具
 * 统一的错误处理和监控
 */
import { ElMessage } from "element-plus"

/**
 * 设置全局错误处理
 * @param {App} app - Vue应用实例
 */
export function setupErrorHandler(app) {
  app.config.errorHandler = (err, vm, info) => {
    console.error('Vue Error:', err, info)

    if (import.meta.env.DEV) {
      ElMessage.error(`应用错误: ${err.message}`)
    } else {
      ElMessage.error('应用出现错误，请刷新页面重试')
    }
  }

  window.addEventListener('unhandledrejection', (event) => {
    console.error('Unhandled Promise Rejection:', event.reason)

    if (import.meta.env.DEV) {
      ElMessage.error(`Promise错误: ${event.reason?.message || '未知错误'}`)
    } else {
      ElMessage.error('网络请求失败，请检查网络连接')
    }

    event.preventDefault()
  })

  window.addEventListener('error', (event) => {
    console.error('JavaScript Error:', event.error)

    if (import.meta.env.DEV) {
      ElMessage.error(`JS错误: ${event.error?.message}`)
    } else {
      ElMessage.error('页面出现错误，请刷新重试')
    }
  })
}

/**
 * 网络状态监控
 */
export function setupNetworkMonitor() {
  window.addEventListener('online', () => {
    ElMessage.success('网络连接已恢复')
  })

  window.addEventListener('offline', () => {
    ElMessage.warning('网络连接已断开，请检查网络设置')
  })

  if (!navigator.onLine) {
    ElMessage.warning('当前网络连接不可用')
  }
}

/**
 * 性能监控
 */
export function setupPerformanceMonitor() {
  window.addEventListener('load', () => {
    setTimeout(() => {
      const perfData = performance.getEntriesByType('navigation')[0]
      if (perfData) {
        const loadTime = perfData.loadEventEnd - perfData.fetchStart
        if (loadTime > 5000) {
          console.warn('页面加载较慢，建议优化')
        }
      }
    }, 0)
  })
}

/**
 * 统一错误处理函数
 */
export function handleError(error, options = {}) {
  const {
    message = '操作失败',
    showMessage = true,
    logToConsole = true,
    context = ''
  } = options

  const errorMessage = extractErrorMessage(error, message)

  if (logToConsole && import.meta.env.DEV) {
    const prefix = context ? `[${context}]` : '[Error]'
    console.error(prefix, error)
  }

  if (showMessage) {
    ElMessage.error(errorMessage)
  }

  return errorMessage
}

function extractErrorMessage(error, defaultMessage) {
  if (typeof error === 'string') {
    return error
  }
  return error?.response?.data?.message || error?.message || defaultMessage
}

export function handleSuccess(message) {
  ElMessage.success(message)
}

export function handleWarning(message) {
  ElMessage.warning(message)
}

export function handleInfo(message) {
  ElMessage.info(message)
}
